/**
 * 消息内容类型常量
 */
export const MessageContentType = {
  TEXT: 1,      // 文本消息
  IMAGE: 2,     // 图片消息（base64）
  FILE: 3,      // 文件消息
  CALL_INVITE: 4,  // 通话邀请消息
  CALL_CANCEL: 5,  // 通话取消/结束消息
} as const;

/**
 * 将 File 对象转换为 base64 字符串
 * @param file 要转换的文件
 * @param maxSizeKB 最大文件大小（KB），超过此大小会压缩或拒绝
 * @returns Promise<string> base64 字符串（包含 data URI 前缀）
 */
export const fileToBase64 = (file: File, maxSizeKB: number = 1024): Promise<string> => {
  return new Promise((resolve, reject) => {
    // 检查文件大小
    const fileSizeKB = file.size / 1024;
    if (fileSizeKB > maxSizeKB * 2) {
      reject(new Error(`文件太大（${fileSizeKB.toFixed(2)}KB），请选择小于 ${maxSizeKB * 2}KB 的图片`));
      return;
    }

    const reader = new FileReader();
    
    reader.onload = () => {
      const result = reader.result as string;
      resolve(result);
    };
    
    reader.onerror = (error) => {
      reject(new Error('文件读取失败: ' + error));
    };
    
    reader.readAsDataURL(file);
  });
};

/**
 * 压缩图片（如果太大）
 * @param file 图片文件
 * @param maxWidth 最大宽度
 * @param maxHeight 最大高度
 * @param quality 压缩质量 (0-1)
 * @returns Promise<File> 压缩后的文件
 */
export const compressImage = async (
  file: File,
  maxWidth: number = 1920,
  maxHeight: number = 1920,
  quality: number = 0.8
): Promise<File> => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    
    reader.onload = (e) => {
      const img = new Image();
      
      img.onload = () => {
        const canvas = document.createElement('canvas');
        let width = img.width;
        let height = img.height;
        
        // 计算缩放比例
        if (width > maxWidth || height > maxHeight) {
          const ratio = Math.min(maxWidth / width, maxHeight / height);
          width = width * ratio;
          height = height * ratio;
        }
        
        canvas.width = width;
        canvas.height = height;
        
        const ctx = canvas.getContext('2d');
        if (!ctx) {
          reject(new Error('无法创建画布上下文'));
          return;
        }
        
        // 绘制图片
        ctx.drawImage(img, 0, 0, width, height);
        
        // 转换为 Blob
        canvas.toBlob(
          (blob) => {
            if (!blob) {
              reject(new Error('图片压缩失败'));
              return;
            }
            
            const compressedFile = new File([blob], file.name, {
              type: file.type,
              lastModified: Date.now(),
            });
            
            resolve(compressedFile);
          },
          file.type,
          quality
        );
      };
      
      img.onerror = () => {
        reject(new Error('图片加载失败'));
      };
      
      img.src = e.target?.result as string;
    };
    
    reader.onerror = () => {
      reject(new Error('文件读取失败'));
    };
    
    reader.readAsDataURL(file);
  });
};

/**
 * 检查文件是否为图片
 */
export const isImageFile = (file: File): boolean => {
  return file.type.startsWith('image/');
};

/**
 * 获取 base64 字符串的大小（KB）
 */
export const getBase64SizeKB = (base64: string): number => {
  // base64 字符串大小约为原始文件的 4/3
  // 减去 data URI 前缀（如 "data:image/png;base64,"）
  const base64Data = base64.split(',')[1] || base64;
  return (base64Data.length * 3) / 4 / 1024;
};

